41 pickle 模块

389次阅读
没有评论

共计 1791 个字符,预计需要花费 5 分钟才能阅读完成。

引入

Pickle 是 Python 特有的序列化模块, 它只能用于 Python, 并且可能不同版本的 Python 彼此都不兼容,但是 pickle 的好处是可以存储 Python 中的 所有的数据类型,包括对象,而 json 不行

ps : 一般用 Pickle 保存那些不重要的数据,不能成功地反序列化也没关系

一. 序列化与反序列化介绍

Pickle 是 Python 的内置模块👈点我给你介绍

二.Pickle 的使用

1. 简单使用

  • pickle 将数据存成 Bytes 类型
import pickle

s = {1,2,3,4}
print(pickle.dumps(s))
# b'\x80\x03cbuiltins\nset\nq\x00]q\x01(K\x01K\x02K\x03K\x04e\x85q\x02Rq\x03.'

b = b'\x80\x03cbuiltins\nset\nq\x00]q\x01(K\x01K\x02K\x03K\x04e\x85q\x02Rq\x03.'
print(pickle.loads(b))
# {1, 2, 3, 4}

2. 写入文件序列化与反序列化

  • 序列化 : .dumps()
import pickle

s = {1, 2, 3, 4, 5,}
res = pickle.dumps(s)
with open('db.pkl', 'wb',)as f:
    f.write(res)
  • 反序列化 : loads()
with open('db.pkl', 'rb')as f:
    data = f.read()
    dic = pickle.loads(data)
    print(res,type(res))  # {1, 2, 3, 4, 5} <class 'set'>

3. 简单序列化与反序列化 (提供直接写入文件功能)

  • 序列化 : dump()
import pickle

s=[1,2,3,4,5]
with open('db.pic','wb')as f:
    pickle.dump(s,f)
  • 反序列化 : load()
with open('db.pic','rb')as f:
    res = pickle.load(f)
    print(res,type(res))  # [1, 2, 3, 4, 5] <class 'list'>

三.Pickle 与 json 对比

1.json 格式

  • 通用格式, 任何语言都支持, 并且都可以解析
  • 数据类型有限 : 字典, 列表, 布尔

2.pickle 格式

  • 只适用于 Python, 序列化之后拿到的返回值是 Bytes 类型, 其他语言识别不了
  • 但可以支持 Python 中的 任意类型

3. 两种格式序列化与反序列化对比

import json
import pickle

dic = {'name' : 'shawn'}

⛅序列化
jjj = json.dumps(dic)
ppp = pickle.dumps(dic)
print(jjj)  # {"name": "shawn"}
print(ppp)  # b'\x80\x03}q\x00X\x04\x00\x00\x00nameq\x01X\x05\x00\x00\x00shawnq\x02s.'
print(type(jjj))  # <class 'str'>
print(type(ppp)   # <class 'bytes'>

⛅反序列化
jjj2 = json.loads('{"name": "shawn"}')
ppp2 = pickle.loads(b'\x80\x03}q\x00X\x04\x00\x00\x00nameq\x01X\x05\x00\x00\x00shawnq\x02s.')
print(jjj2)  # {'name': 'shawn'}
print(ppp2)  # {'name': 'shawn'}
print(jjj2["name"],type(jjj2))  # shawn <class 'dict'>
print(ppp2["name"],type(ppp2))  # shawn <class 'dict'>

4.pickle 可序列化任意类型小示例

import json
import pickle

dic = {'type' : input}
res1 = json.dumps(dic)   # 报错 : TypeError
res2 = p c) 
print(res2)  # b'\x80\x03}q\x00X\x04\x00\x00\x00typeq\x01cbuiltins\ninput\nq\x02s.'

pickle.loads(res2)["type"]()  # 反序列化加括号 "()" 出来可以直接使用 "input" 函数
正文完
 
shawn
版权声明:本站原创文章,由 shawn 2023-06-16发表,共计1791字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)